From d98a23dc8000345a29eb27dd30d0cb00b0ae0a64 Mon Sep 17 00:00:00 2001 From: Daniel Boles Date: Tue, 15 Aug 2017 19:29:22 +0100 Subject: [PATCH] GdkDisplay: Call the correct push|pop_error_trap() It is wrong to assume all Displays are of the same class as the default. https://bugzilla.gnome.org/show_bug.cgi?id=784016 --- gdk/gdkdisplay.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 09b95eaeff..6b445c2902 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -2011,41 +2011,38 @@ void gdk_error_trap_push (void) { GdkDisplayManager *manager; - GdkDisplayClass *class; GdkGlobalErrorTrap *trap; + GSList *displays; GSList *l; manager = gdk_display_manager_get (); - class = GDK_DISPLAY_GET_CLASS (gdk_display_manager_get_default_display (manager)); + displays = gdk_display_manager_list_displays (manager); - if (class->push_error_trap == NULL) - return; - - trap = g_slice_new (GdkGlobalErrorTrap); - trap->displays = gdk_display_manager_list_displays (manager); + trap = g_slice_new0 (GdkGlobalErrorTrap); + for (l = displays; l != NULL; l = l->next) + { + GdkDisplay *display = l->data; + GdkDisplayClass *class = GDK_DISPLAY_GET_CLASS (display); - g_slist_foreach (trap->displays, (GFunc) g_object_ref, NULL); - for (l = trap->displays; l != NULL; l = l->next) - class->push_error_trap (l->data); + if (class->push_error_trap != NULL) + { + class->push_error_trap (display); + trap->displays = g_slist_prepend (trap->displays, g_object_ref (display)); + } + } g_queue_push_head (&gdk_error_traps, trap); + + g_slist_free (displays); } static gint gdk_error_trap_pop_internal (gboolean need_code) { - GdkDisplayManager *manager; - GdkDisplayClass *class; GdkGlobalErrorTrap *trap; gint result; GSList *l; - manager = gdk_display_manager_get (); - class = GDK_DISPLAY_GET_CLASS (gdk_display_manager_get_default_display (manager)); - - if (class->pop_error_trap == NULL) - return 0; - trap = g_queue_pop_head (&gdk_error_traps); g_return_val_if_fail (trap != NULL, 0); @@ -2053,7 +2050,9 @@ gdk_error_trap_pop_internal (gboolean need_code) result = 0; for (l = trap->displays; l != NULL; l = l->next) { - gint code = class->pop_error_trap (l->data, !need_code); + GdkDisplay *display = l->data; + GdkDisplayClass *class = GDK_DISPLAY_GET_CLASS (display); + gint code = class->pop_error_trap (display, !need_code); /* we use the error on the last display listed, why not. */ if (code != 0) -- 2.30.2